<?php
/**
 * CPageGrid class file.
 *
 * @author Lucas Vasconcelos <contato@lucasvasconcelos.com>
 * @copyright Copyright(c) 2010 Lucas Vasconcelos
 * @license BSD License http://www.vasconcelossa.com.br/yap/license
 * @link http://www.vasconcelossa.com.br/yap/
 * @version $Id: CPageGrid.php 15 2010-02-03 01:08:53Z contato@lucasvasconcelos.com $
 * @package yap.web.ui
 */

Prado::using('System.Data.ActiveRecord.TActiveRecordCriteria');
Prado::using('yap.web.ui.CPage');
Prado::using('yap.web.ui.interfaces');
Prado::using('yap.web.ui.CGridEventHandler');
Prado::using('yap.web.ui.CGridManager');

/**
 * CPageGrid class.
 *
 * Fornece infraestrutura para criar páginas cuja principal função é exibir dados tabulados.
 * No código template é necessário incluir um controle TDataGrid com ID 'grid' (definido em IPageGrid::GRID_ID).
 * Com a configuração padrão, páginas derivadas de CPageGrid contam com recursos de páginação, ordenação e filtro
 * para os resultados exibidos em TDataGrid.
 * 
 * @author Lucas Vasconcelos <contato@lucasvasconcelos.com>
 * @version 1.2 $Revision: 15 $
 * @package yap.web.ui
 */
abstract class CPageGrid extends CPage implements IPageGrid
{
	/**
	 * @var CGridManager
	 */
	private $_gridManager=null;
	
	/**
	 * Registra event-handlers para os eventos disparados por {@link CPageGrid}.
	 */
	public function onInit($param)
	{
		parent::onInit($param);
		$this->registerEventHandlers();
		
		Prado::trace('PageGrid onSetupGrid()','yap.web.ui');
		$this->onSetupGrid(null);
	}

	/**
	 * Executa método processRequest para tratar requisições do usuário.
	 */
	public function onLoad($param)
	{
		parent::onLoad($param);
		
		Prado::trace('PageGrid processRequest()','yap.web.ui');
		$this->processRequest();
	}
	
	/**
	 * Este método é invocado durante o estágio OnInit.
	 * Este método dispara o evento 'OnSetupGrid' para acionar os manipuladores de evento.
	 * Se sobreescrever este método, certifique-se de chamar a implementação da classe pai para que
	 * os manipuladores de evento sejam acionados.
	 * @param TEventParameter parâmetro do evento que deve ser passado para os manipuladores de evento.
	 */
	public function onSetupGrid($param)
	{
		$this->raiseEvent('OnSetupGrid',$this,$param);
	}

	/**
	 * Este método é invocado durante o evento 'OnLoad' ou quando houver necessidade de modificar o objeto
	 * TActiveRecordCriteria.
	 * Este método dispara o evento 'OnSetupCriteria' para acionar os manipuladores de evento.
	 * Se sobreescrever este método, certifique-se de chamar a implementação da classe pai para que
	 * os manipuladores de evento sejam acionados.
	 * @param TEventParameter parâmetro do evento que deve ser passado para os manipuladores de evento.
	 */
	public function onSetupCriteria($param)
	{
		$this->raiseEvent('OnSetupCriteria',$this,$param);
	}

	/**
	 * Este método é invocado durante o evento 'OnLoad' ou quando houver necessidade de atualizar o
	 * conteúdo do objeto TDataGrid.
	 * Este método dispara o evento 'OnLoadGrid' para acionar os manipuladores de evento.
	 * Se sobreescrever este método, certifique-se de chamar a implementação da classe pai para que
	 * os manipuladores de evento sejam acionados.
	 * @param TEventParameter parâmetro do evento que deve ser passado para os manipuladores de evento.
	 */
	public function onLoadGrid($param)
	{
		$this->raiseEvent('OnLoadGrid',$this,$param);
	}

	/**
	 * GridManager get property
	 * @return CGridManager instance object.
	 */
	public function getGridManager()
	{
		if($this->_gridManager===null)
			$this->_gridManager=new CGridManager($this);
		return $this->_gridManager;
	}

	public function bindPortlet(CGridPortlet $portlet)
	{
		
	}
	
	/**
	 * Registra manipuladores de evento.
	 */
	protected function registerEventHandlers()
	{
		$this->attachEventHandler('OnSetupGrid',array('CGridEventHandler','setupGrid'));
		$this->attachEventHandler('OnSetupCriteria',array('CGridEventHandler','setupCriteria'));
		$this->attachEventHandler('OnLoadGrid',array('CGridEventHandler','loadGrid'));
	}
	
	/**
	 * Processa requisição do usuário.
	 * Este método é invocado durante o estágio 'OnLoad'.
	 */
	protected function processRequest()
	{
		if(!$this->getIsPostBack())
		{
			Prado::trace('CPageGrid onSetupCriteria()','yap.web.ui');
			$this->onSetupCriteria(null);

			Prado::trace('CPageGrid onLoadGrid()','yap.web.ui');
			$this->onLoadGrid(null);
		}
		else
			Prado::trace('CPageGrid postBack event.','yap.web.ui');
	} 
}